/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao.khachhang;

import com.nvca.util.DateUtil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import model.dao.AbstractQuery;
import model.dao.ProjectQuery;
import model.dao.bacsi.BacSiDAO;
import model.entity.KhachHang;
import model.util.HibernateUtil;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;

/**
 *
 * @author nv_ca@live.com
 */
public class KhachHangDAO {

    /**
     * Load tất cả các khách hàng vào 1 List
     *
     * @return List danh sách tất cả các khách hàng. Mỗi 1 đối tượng trong List
     * trả về là 1 dòng (row) trong database.
     */
    public static final List loaddAllKhachHang() {
        return AbstractQuery.loadObject(ProjectQuery.LOAD_ALL_KHACH_HANG);
    }

    public static final KhachHang load1KhachHang(int khMa) {
        Session session = HibernateUtil.getSessionFactory().openSession();
       session.beginTransaction();
//        List<KhachHang> list = AbstractQuery.loadObject(ProjectQuery.LOAD_1_KHACH_HANG + khMa);
        List<KhachHang> list = session.createQuery("FROM KhachHang kh WHERE kh.khMa =" + khMa).list();
         
        for (KhachHang khachHang : list) {
            if(khachHang.getBacSi() != null)
                Hibernate.initialize(khachHang.getBacSi());
            if(khachHang.getBacSi().getAdmin() != null)
                Hibernate.initialize(khachHang.getBacSi().getAdmin());
        }
        session.getTransaction().commit();
        return list.get(0);
    }

    /**
     * Thêm mới một khách hàng
     *
     * @param kh đối tượng khách hàng cần thêm
     */
//    public final static void insertKhachHang(KhachHang kh) {
////        AbstractQuery.insertObject(kh.getBacSi());
////        BacSiDAO.insertBacSi(kh.getBacSi());
//        AbstractQuery.insertObject(kh);
//        
//    }
    
    public static final int insertKhachHang(KhachHang kh){
        Session session = HibernateUtil.getSessionFactory().openSession();
        int id;
        try {
//            BacSiDAO.insertBacSi(kh.getBacSi());
            session.beginTransaction();
            session.save(kh);
            session.getTransaction().commit();
            id = kh.getKhMa();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw  new HibernateException(e);
        }finally{
            session.close();
        }
        return id;
        
    }

    /**
     * Sửa thông tin một khách hàng.
     *
     * @param kh đối tượng Khách Hàng sẽ được sửa thông tin.
     */
    public static final void updateKhachHang(KhachHang kh) {
        AbstractQuery.updateObject(kh);
    }
     public static  void deleteKhachHang(int khMa){
        AbstractQuery.modifyObject(3, AbstractQuery.loadObject(ProjectQuery.LOAD_1_KHACH_HANG + khMa).get(0));
    }

    /**
     * Sao lưu một khách hàng.
     *
     * @param kh đối tượng Khách Hàng được sao lưu.
     * @param path đường dẫn folder sẽ chứa các file backup (dang *.bkp)
     */
    public static final void backupKhachHang(KhachHang kh, String dirPath) {
        try {
            // Lưu các thông tin cần thiết ra file theo đường dẫn dirPath
            String khHo = kh.getKhHo();
            String khTen = kh.getKhTen();
            String khGioiTinh = kh.getKhGioiTinh();
            Date khNgaySinh = kh.getKhNgaySinh();
            String khDiaChi = kh.getKhDiaChi();
            String khSDT = kh.getKhSdt();
            String khGhiChu = kh.getKhGhiChu();

            File bkpKh = new File(dirPath + "/" + khHo + khTen + ".bkp");
            FileWriter writer = new FileWriter(bkpKh);
            BufferedWriter bw = new BufferedWriter(writer);
            bw.write(khHo + "\n");
            bw.write(khTen + "\n");
            bw.write(khGioiTinh + "\n");
            bw.write(khNgaySinh.toString() + "\n");
            bw.write(khDiaChi + "\n");
            bw.write(khSDT + "\n");
            bw.write(khGhiChu + "\n");
            bw.close();
            writer.close();

            //  TODO Muốn xóa đối tượng Khách hàng thì phải xóa hết vật nuôi tham chiếu tới nó
            // Xóa đối tượng kh đã được lưu ra file trong db
            AbstractQuery.deleteObject(kh);

        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
    }

    /**
     * Phục hồi một khách hàng.
     *
     * @param filePath đường dẫn chứa các file backup để phục hồi (dang *.bkp)
     */
    public static final void restoreKhachHang(String filePath) {
        try {
            // đọc file backup lên
            File bkpKh = new File(filePath);
            FileReader reader = new FileReader(bkpKh);
            BufferedReader bf = new BufferedReader(reader);

            // đọc theo từng dòng
            String khHo = bf.readLine();
            String khTen = bf.readLine();
            String khGioiTinh = bf.readLine();
            String khNgaySinhSt = bf.readLine();
            Date khNgaySinh = DateUtil.shortDate(khNgaySinhSt);
            String khDiaChi = bf.readLine();;
            String khSDT = bf.readLine();
            String khGhiChu = bf.readLine();

            // tạo đối tượng khách hàng lưu từng dòng đó lại
            KhachHang kh = new KhachHang();
            kh.setKhHo(khHo);
            kh.setKhTen(khTen);
            kh.setKhGioiTinh(khGioiTinh);
            kh.setKhNgaySinh(khNgaySinh);
            kh.setKhSdt(khSDT);
            kh.setKhDiaChi(khDiaChi);
            kh.setKhGhiChu(khGhiChu);

            //close reader and buffer
            bf.close();
            reader.close();

            // thêm khách hàng vào lại CSDL
            insertKhachHang(kh);

            // xóa file trên đĩa cứng
            bkpKh.delete();
        } catch (FileNotFoundException e1) {
            System.err.println(e1.getMessage());
        } catch (IOException e2) {
            System.err.println(e2.getMessage());
        }
    }
    
    /**
     * Liệt kê theo tên khác hàng
     */
    public final static List<KhachHang> lietKeTheoTenKhachHang(String tenKH){
        List list = AbstractQuery.loadObject(ProjectQuery.LOAD_2_KHACH_HANG +"'"+ tenKH+"'");
        return list;
    }
    
    /**
     * Liet kê theo Mã Khách Hàng
     */
    public final static List<KhachHang> lietKeTheoMaKhachHang(int maKH){
        List list = AbstractQuery.loadObject(ProjectQuery.LOAD_1_KHACH_HANG +"'"+ maKH + "'");
        return list;
    }
    /**
     * thêm thông tin khách hàng
     */
    public final static boolean themKhachHang(String khHo, String khTen, String khGioiTinh, Date khNgaySinh, String khSDT,String khDiaChi,String khGhiChu ){
         // tạo đối tượng khách hàng lưu từng dòng đó lại
            KhachHang kh = new KhachHang();
            kh.setKhHo(khHo);
            kh.setKhTen(khTen);
            kh.setKhGioiTinh(khGioiTinh);
            kh.setKhNgaySinh(khNgaySinh);
            kh.setKhSdt(khSDT);
            kh.setKhDiaChi(khDiaChi);
            kh.setKhGhiChu(khGhiChu);
            
            insertKhachHang(kh);
            
        return true;
        
        /**
         * Sửa Thông tin khách hàng Dialog
         */
       
    }
 public static final boolean suaKhachHangDialog(int maKH, String khHo, String khTen, String khGioiTinh, Date ngaySinh, String khSDT,String khDiaChi,String khGhiChu){
            KhachHang kh = new KhachHang();
            kh.setKhMa(maKH);
            kh.setKhHo(khHo);
            kh.setKhTen(khTen);
            kh.setKhGioiTinh(khGioiTinh);
            kh.setKhNgaySinh(ngaySinh);
            kh.setKhSdt(khSDT);
            kh.setKhDiaChi(khDiaChi);
            kh.setKhGhiChu(khGhiChu);
            
            updateKhachHang(kh);

        return true;
            
        }
 public static void main(String[] args){
     System.out.println(load1KhachHang(3));
 }
}

